; thghh-os
; TAB=4
CYLS	EQU	20
	org 0x7c00

;标准FAT12格式软盘专用代码

	jmp entry
	db 0x90
	db "THGHHIPL"	;启动区名称,8个字节
	dw 512			;每个扇区的大小，必须为512
	db 1			;簇的大小，必须为1个扇区
	dw 1			;FAT的起始位置，一般从第一个开始
	db 2			;FAT的个数，必须是2
	dw 224			;根目录的大小，一般设置成224项
	dw 2880			;该磁盘的大小，必须是2880
	db 0xf0			;磁盘的种类，必须是0xf0
	dw 9			;FAT的长度，必须是9个扇区
	dw 18			;1个磁道有几个扇区，必须是18
	dw 2			;磁头数，必须是2
	dd 0			;不使用分区，必须是0
	dd 2880			;重写一次磁盘的大小
	db 0,0,0x29		;意义不明，固定
	dd 0xffffffff	;可能是卷标号码
	db "THGHH-OS   ";磁盘的名称，11字节
	db "FAT12   "	;磁盘格式名称，8字节
	resb 18			;空出18字节

;程序主体

entry:
	mov ax,0
	mov ss,ax
	mov sp,0x7c00
	mov ds,ax
	
	mov ax,0x0820
	mov es,ax
	mov dh,0	;磁头0
	mov ch,0	;柱面0
	mov cl,2	;扇区2
readloop:
	mov si,0	;记录失败次数的寄存器
retry:
	mov ah,0x02	;读盘
	mov al,1	;一个扇区
	mov bx,0 	;ES:BX=数据缓冲区地址
	mov dl,0x00	;A驱动器
	int 0x13	;13号中断，读磁盘
	jnc next	;没出错的话跳转到next
	add si,1
	cmp si,5
	jae error	;si>5 时，调到error执行
	mov ah,0h	;重置驱动器
	mov dl,0h
	int 13h		
	jmp retry
	
next:
	mov ax,es
	add ax,20h
	mov es,ax		;数据缓冲区后移
	add cl,1		;读下一个扇区
	cmp cl,18		;直到第18个扇区为止
	jbe readloop	;如果cl<=18,跳转到readloop
	mov cl,1		;重置扇区为1
	add dh,1		;磁头1
	cmp dh,2
	jb readloop		;如磁头号小雨2，跳转到readloop
	mov dh,0		;重置磁头号为0
	add ch,1		;柱面加1
	cmp ch,CYLS		;ch<CYLS，跳转到readloop
	jb readloop
	
;执行到haribote.nas
	MOV		[0x0ff0],CH		; 注意IPL是我读到的地方
	JMP		0xc200
	
error:
	mov ax,0
	mov es,ax
	mov si,msg
putloop:
	mov al,[si]
	add si,1
	cmp al,0
	je fin	;al等于0则转移
	mov ah,0x0e
	mov bx,15
	int 0x10
	jmp putloop
	
fin:
	hlt
	jmp fin
	
;信息显示部分
msg:
	db 0x0a,0x0a   ;换2行
	db "load error"
	db 0x0a        ;换行
	db 0

	resb 0x7dfe-$  ;填写到0x00,直到0x001fe; 0x7dfeまでを0x00で埋める命令
	db 0x55,0xaa